﻿/****************************************************************************/
/*											                                */
/* Clase : Salon           							                        */
/* Autor : Marc Esteve Fernández					                        */
/* Descripción: Salon perteneciente a una zona                              */
/* 											                                */
/****************************************************************************/
using System;
using System.Collections.Generic;
using Iesi.Collections.Generic;
using Iesi.Collections;
using CRC.Inspecciones.Dominio.Clases;
using CRC.Incidencias.Dominio.Clases;

namespace CRC.GestionSalones.Dominio.Clases
{
    public class Salon
    {
        #region "Atributos y Accesores"

        private int intId;
        private String strNombreSalon = String.Empty;
        private String strNumProyecto;
        private String strCP = null;
        private int? intTelefono;
        private String strAltitud = String.Empty;
        private String strLatitud = String.Empty;
        private TipoPropiedad tipoPropiedad = null;
        private String strDireccion = String.Empty;
        private String strObservaciones = String.Empty;
        private Municipio municipio;
        private Zona zona = null;
        
        private ISet<Congregacion> asistentes = new HashedSet<Congregacion>();
        private ISet<HojaInspeccion> hojasInpeccion = new HashedSet<HojaInspeccion>();
        private ISet<Incidencia> incidencias = new HashedSet<Incidencia>();
        private ISet<LineaSeguimientoInspeccion> trazabilidadInspecciones = new HashedSet<LineaSeguimientoInspeccion>();
        private ISet<Foto> fotos = new HashedSet<Foto>();

        /*Constructor por defecto*/
        public Salon() {}

        public Salon(
            String pStrNumProyecto,
            String pStrNombreSalon,
            Provincia pProv,
            Municipio pMunic,
            Zona pZona,
            String pStrDireccion,
            String pStrCPostal,
            String pStrAltitud,
            String pStrLatitud,
            int? pIntTelefono,
            String pStrObservaciones,
            TipoPropiedad pTipoPropiedad
         ) {
            
            this.strNumProyecto = pStrNumProyecto;
            this.strNombreSalon = pStrNombreSalon;
            this.municipio = pMunic;
            pZona.añadirSalon(this);
            this.strDireccion = pStrDireccion;
            this.strCP = pStrCPostal;
            this.strCP = pStrCPostal;
            this.strAltitud = pStrAltitud;
            this.strLatitud = pStrLatitud;
            this.intTelefono = pIntTelefono;
            this.strObservaciones = pStrObservaciones;
            this.tipoPropiedad = pTipoPropiedad;
        }

        public virtual int Id
        {
            get { return intId; }
            set {  intId = value; }
        }

        public virtual String Nombre_Salon
        {
            get { return strNombreSalon; }
            set { strNombreSalon = value; }
        }

        public virtual String Proyecto
        {
            get { return this.strNumProyecto; }
            set { this.strNumProyecto = value; }
        }

        public virtual String Observaciones
        {
            get { return strObservaciones; }
            set { strObservaciones = value; }
        }

        public virtual Zona Zona
        {
            get { return this.zona; }
            set { this.zona = value; }
        }

        public virtual Municipio Municipio 
        {
            get { return this.municipio; }
            set { this.municipio = value; }
        }

        public virtual String CP
        {
            get { return strCP; }
            set { strCP = value; }
        }

        public virtual int? Telefono
        {
            get { return intTelefono; }
            set { intTelefono = value; }
        }

        public virtual String GPS_Altitud
        {
            get { return strAltitud; }
            set { strAltitud = value; }
        }

        public virtual String GPS_Latitud
        {
            get { return strLatitud; }
            set
            { strLatitud = value;}
        }

        public virtual TipoPropiedad TipoPropiedad
        {
            get { return this.tipoPropiedad; }
            set { this.tipoPropiedad = value; }
        }

        public virtual String Direccion
        {
            get { return strDireccion; }
            set { strDireccion = value; }
        }

        public virtual ISet<Congregacion> Asistentes 
        {
            get { return asistentes; }
            set { this.asistentes = value; }
        }

        public virtual ISet<HojaInspeccion> HojasInspeccion 
        {
            get { return this.hojasInpeccion; }
            set { this.hojasInpeccion = value; }
        }

        public virtual ISet<Incidencia> IncidenciasNotificadas 
        {
            get { return this.incidencias; }
            set { this.incidencias = value; }
        }

        public virtual ISet<LineaSeguimientoInspeccion> TrazabilidadInspecciones
        {
            get { return this.trazabilidadInspecciones; }
            set { this.trazabilidadInspecciones = value; }
        }

        #endregion

        public virtual ISet<Foto> Fotos 
        {
            get { return this.fotos; }
            set { this.fotos = value; }
        }

        public virtual Congregacion Anfitriona() 
        {
            foreach (Congregacion asistente in asistentes)
            {
                if (asistente.EsAnfitriona) return asistente;
            }
            return null;
        }

        public virtual void añadirHojaInspeccion(HojaInspeccion pHoja) 
        {
            this.HojasInspeccion.Add(pHoja);
            //pHoja.SalonInspeccionado = this;
        }

        public virtual void añadirIncidencia(Incidencia pInc) {
            this.incidencias.Add(pInc);
            pInc.Salon = this;
        }

        public virtual void quitarIncidencia(Incidencia pInc)
        {
            pInc.Salon = null;
            this.IncidenciasNotificadas.Remove(pInc);
        }
        
        public virtual void añadirFoto(Foto pFot) 
        {
            pFot.Salon = this;
            Fotos.Add(pFot);
        }

        public virtual Foto nuevaFoto(String pStrArchivo, Categoria pCategoria, String pStrComentarios) 
        {
            Foto f = new Foto(pStrArchivo, pCategoria, pStrComentarios, this);
            return f;
        }

        public virtual Congregacion nuevaCongregacion(
            int pIntNumero,
            String pstrNombreCRC,
            String pstrNobreSucursal,
            Boolean pEsAnfitriona,
            String pStrObservaciones,
            Persona pPresidente,
            Persona pSecretario,
            Persona pSupCircuito) 
        {
            Congregacion cong = new Congregacion(
                        pIntNumero,
                        pstrNombreCRC,
                        pstrNobreSucursal,
                        pEsAnfitriona,
                        this,
                        pStrObservaciones,
                        pPresidente,
                        pSecretario,
                        pSupCircuito
                    );
            asistentes.Add(cong);
            
            return cong;
        }

        
    }
}
